package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.dao.MenuDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.exception.MenuException;
import com.itheima.pojo.Menu;
import com.itheima.utils.MenuUtil;
import com.itheima.utils.RemUtil;
import com.mysql.jdbc.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 用户服务
 */
@Service(interfaceClass = MenuService.class)
@Transactional
public class MenuServiceImpl implements MenuService {
    @Autowired
    private MenuDao menuDao;

    @Override
    public List<Menu> findAll() {
        return menuDao.findAll();
    }

    @Override
    public Integer[] findMenuIdsByRoleId(Integer id) {
        return menuDao.findMenuIdsByRoleId(id);
    }

    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        String queryString = queryPageBean.getQueryString();//查询条件
        //完成分页查询，基于mybatis框架提供的分页助手插件完成
        PageHelper.startPage(currentPage,pageSize);
        //select * from t_checkitem limit 0,10
        Page<Menu> page = menuDao.findPage(queryString);
        List<Menu> menuList = MenuUtil.getMenuList(page);

        long total = page.getTotal();
        return new PageResult(total,menuList);
    }

    @Override
    public Integer findLevelById(Integer id) {
        return menuDao.findLevelById(id);
    }

    @Override
    public void add(Menu menu) {
        if(menu.getParentMenuId()==null){
            //当添加的数据父ID为Null则表示该菜单为1级菜单
            menu.setPath((menu.getPriority()+1)+"");
            menu.setLevel("1");
        }
        else {
            Menu byMenuId = menuDao.findByMenuId(menu.getParentMenuId());
            //获取该子菜单的父菜单path进行字符串拼接
            menu.setPath(byMenuId.getPath()+"-"+menu.getPriority());
            int i = Integer.parseInt(byMenuId.getLevel());
            menu.setLevel((i+1)+"");
        }
        menuDao.add(menu);
        //当该菜单被添加时，应被添加至admin角色中
//        menuDao.addRoleMenuByAdmin(menu.getId());
    }

    @Override
    public void edit(Menu menu) throws MenuException {
        //先判断该菜单的父菜单是否发生改变
        if (menuDao.findByMenuId(menu.getId()).getParentMenuId()!=menu.getParentMenuId()){
            //若该菜单下面有子菜单，则不允许删除
            int i = menuDao.findParentIdCountByMenuId(menu.getId());
            if (i>0)
                throw new MenuException();
        }
        if(menu.getParentMenuId()==null){
            //当添加的数据父ID为Null则表示该菜单为1级菜单
            menu.setPath((menu.getPriority()+1)+"");
            menu.setLevel("1");
        }
        else {
            Menu byMenuId2 = menuDao.findByMenuId(menu.getParentMenuId());
            //获取该子菜单的父菜单path进行字符串拼接
            menu.setPath(byMenuId2.getPath()+"-"+menu.getPriority());
            int i2 = Integer.parseInt(byMenuId2.getLevel());
            menu.setLevel((i2+1)+"");
        }
        menuDao.edit(menu);
    }

    @Override
    //设置该方法的事务传播行为NOT_SUPPORTED
//    @Transactional(propagation= Propagation.NOT_SUPPORTED)
    public void delete(Integer id) {
        //由于数据库已做级联删除 所以此处不需要递归删除 (已失效，用户规定不能使用级联删除)
        //要删除该菜单以及所关联的菜单，需要对所有数据递归获取要删除的id集合
        List<Integer> remIds = RemUtil.getRemIds(menuDao.findAll(), id);
        for (int i = remIds.size() - 1; i >= 0; i--) {
            menuDao.delete(remIds.get(i));
        }

    }

}
